home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGNG_C / MRUTC.LZH / CLOCK.C < prev    next >
Text File  |  1988-01-19  |  2KB  |  85 lines

  1. /* ---------- clock.c ------------ */
  2. #include <stdio.h>
  3. #include <dos.h>
  4.  
  5. unsigned vmode(void);
  6. void vpoke(unsigned, unsigned, unsigned);
  7. static void interrupt (*oldtimer)(void);
  8. static void interrupt newtimer(void);
  9. extern void interrupt (*ZeroDivVector)(void);
  10. #define sizeprogram 375
  11. unsigned intsp, intss;
  12. unsigned myss, stack;
  13. static union REGS rg;
  14. struct date dat;
  15. struct time tim;
  16. unsigned vseg;
  17. int running = 0;
  18. char bf[20];
  19. unsigned v;
  20. char tmsk [] = " %2d-%02d-%02d %02d:%02d:%02d ";
  21. int ticker = 0;
  22. static struct SREGS seg;
  23.  
  24. void main()
  25. {
  26.     segread(&seg);
  27.     /* ------ save stack of resident program -------- */
  28.     myss = _SS;
  29.     /* --------- prepare timer interrupt vectors -------- */
  30.     oldtimer = getvect(0x1c);
  31.     setvect(0x1c, newtimer);
  32.     stack = (sizeprogram - (seg.ds - seg.cs)) * 16 - 300;
  33.     vseg = vmode() == 7 ? 0xb000 : 0xb800;
  34.     /* ---- get the current date and time ------ */
  35.     gettime(&tim);
  36.     getdate(&dat);
  37.     /* ---- restore zero divide interrupt vector --- */
  38.     setvect(0, ZeroDivVector);
  39.     /* ----- terminate and stay resident ------- */
  40.     rg.x.ax = 0x3100;
  41.     rg.x.dx = sizeprogram;
  42.     intdos(&rg, &rg);
  43. }
  44. /* ----- timer isr ------- */
  45. static void interrupt newtimer()
  46. {
  47.     (*oldtimer)();
  48.     if (running == 0)    {
  49.         running = 1;
  50.         disable();        /* set resident stack */
  51.         intsp = _SP;
  52.         intss = _SS;
  53.         _SP = stack;
  54.         _SS = myss;
  55.         enable();
  56.         if (ticker == 0)    {    /*count ticks (18.2/second)*/
  57.             ticker = (((tim.ti_sec % 5) == 0) ? 19 : 18);
  58.             tim.ti_sec++;
  59.             if (tim.ti_sec == 60)    {
  60.                 tim.ti_sec = 0;
  61.                 tim.ti_min++;
  62.                 if (tim.ti_min == 60)    {
  63.                     tim.ti_min = 0;
  64.                     tim.ti_hour++;
  65.                     if (tim.ti_hour == 24)
  66.                         tim.ti_hour = 0;
  67.                 }
  68.             }
  69.             /* ----- build the date/time display ------- */
  70.             sprintf(bf,tmsk,dat.da_day,dat.da_mon,dat.da_year
  71.                 % 100,tim.ti_hour, tim.ti_min, tim.ti_sec);
  72.         }
  73.         --ticker;
  74.         /* ----- display the date and time -------- */
  75.         for (v = 0; v < 19; v++)
  76.             vpoke(vseg, (60 + v) * 2, 0x7000 + bf[v]);
  77.         disable();        /* reset the interrupted stack */
  78.         _SP = intsp;
  79.         _SS = intss;
  80.         enable();
  81.         running = 0;
  82.     }
  83. }
  84.  
  85.